home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / BF_SDK11.ZIP / ASM.TXT < prev    next >
Text File  |  1996-06-10  |  12KB  |  276 lines

  1.  
  2.                                     BF-SDK
  3.                                     ~~~~~~
  4.                                      V1.1
  5.  
  6.                               Assemblerinterface
  7.                               ~~~~~~~~~~~~~~~~~~
  8.  
  9.                           (c) 1996 Cedric Reinartz
  10.  
  11.  
  12. This documentation helps you to use the assembler interface in your own 
  13. program. A typical program structure would be:
  14.  
  15.    - declaration of some variables
  16.    - include BFE_ASM.INC
  17.    - definition of your data (.DATA)
  18.    - your code (.CODE) where you can use the BF-Macros
  19.  
  20. In the following only the first and last part will be explained. Please
  21. have a look also in BFE_ASM.INC, BFENG386.ASM and ASM_DEMO.ASM to fully 
  22. understand the code.
  23.  
  24. ===============================================================================
  25.  
  26. VARIABLES
  27. ~~~~~~~~~
  28.  
  29.  
  30. NOPUB
  31.  
  32. With this variable you can decide if BFENG386.ASM will be included or if
  33. BFENG386.OBJ will be used. If "noPub" is not defined the functions in BFENG386
  34. will be exported and you can (must) use BFENG386.OBJ. In this case you can not
  35. influence the behavior of BFENG386 further.
  36. Notice that BFENG386.OBJ which is shipped with this package is compiled with
  37. defaults preset in BFENG386.ASM. If you want to use the OBJ with different
  38. options you have to change the defaults and recompile.
  39. An example for this kind of use is the generation of the pascal unit in this
  40. package (BLOWFISH.TPU).
  41. If "noPub" is defined (the value doesn't matter) you include BFENG386.ASM in
  42. your own code. In this case there are variables which influence how 
  43. BFENG386.ASM will be compiled:
  44. Default: not defined
  45.  
  46. -------------------------------------------------------------------------------
  47.  
  48. USESMALL
  49.  
  50. If "useSmall" is not defined the .model large directive will be used. This
  51. will result in CALLs generated as FAR by the assembler. If you want NEAR
  52. CALLs (for speed reasons as example) you have to define "useSmall" (value
  53. doesn't matter).
  54. Default: not defined
  55.  
  56. -------------------------------------------------------------------------------
  57.  
  58. NOLOOP
  59.  
  60. If "noLOOP" is defined with the value "1" all the encryption rounds are placed
  61. after each other. This is very memory consuming, but eliminates the need for
  62. LOOPs and thus gives more speed. Any other value will generate a LOOP
  63. construction which is much smaller and about 20% slower than the enrolled
  64. version.
  65. Use this for TSR's and device drivers which handle slow devices.
  66. Note: This variable must be defined.
  67. Default: 1
  68.  
  69. -------------------------------------------------------------------------------
  70.  
  71. RNDS
  72.  
  73. With "rnds" you can define how many rounds Blowfish should go. There
  74. are 3 possible values:
  75.  
  76.        1:  There are always 16 Rounds to go
  77.        2:  There are always 32 Rounds to go
  78.        3:  You switch between 16 and 32 Rounds by software
  79.  
  80. The different values are all due to speed and memory reasons. A "3" is the most
  81. flexible one. If 16 Rounds are set with "rnds equ 3" the code is a bit slower
  82. and slightly bigger than using "rnds equ 1".
  83. If you use "rnds equ 3" in conjunction with "noLOOP equ 0" you are able to set
  84. the number of rounds from 2 to 32. Remember that the security enhances with a
  85. increasing number of rounds (you should use at least 14), while the speed
  86. decreases with increasing rounds.
  87. Note: This variable must be defined.
  88. Default: 3
  89.  
  90. ===============================================================================
  91.  
  92. MACROS
  93. ~~~~~~
  94.  
  95.  
  96. _InitCrypt seg,off,len
  97.  
  98.  Function   : Initialises the Boxes
  99.  Argument   : seg: segment of the password
  100.               off: offset of the password
  101.               len: length of the password
  102.  Return     : none
  103.  Affects    : all but DS
  104.  Description: A Password with a maximum of 56 Bytes is used to encrypt the
  105.               Boxes. These encrypted boxes are vital for the further encryption
  106.               process with _(CBC)Encrypt and _(CBC)Decrypt. If you want to
  107.               change the password at runtime you have to restore the original
  108.               contents of the boxes before you can use this function again 
  109.               (See _GetBoxes and _SetBoxes).
  110.  
  111. -------------------------------------------------------------------------------
  112.  
  113. _WeakKey
  114.  
  115.  Function   : Test if the generated Boxes are weak
  116.  Argument   : none
  117.  Return     : AX = Status (1=weak, 0=good)
  118.  Affects    : AX, BX, CX, DX, SI, DI, direction Flag
  119.  Description: After "_InitCrypt" you should test the Boxes with this function.
  120.               If they provide a weakness which a cryptoanalyst could use to
  121.               break the cipher a "1" is returned. In this case you should
  122.               reload the original boxes and let the user choose a different 
  123.               password.
  124.  
  125. -------------------------------------------------------------------------------
  126.  
  127. _Encrypt seg,off,len
  128.  
  129.  Function   : Encrypts a plaintext string using the ECB method
  130.  Argument   : seg: segment of the plaintext
  131.               off: offset of the plaintext
  132.               len: length of the plaintext
  133.  Return     : none
  134.  Affects    : all but DS
  135.  Description: This function encrypts (multiple) blocks of 8 Bytes of plaintext
  136.               using the ECB method (blocks are not chained). The generated 
  137.               ciphertext will overwrite the plaintext. Thus the seg:off 
  138.               argument will point to the ciphertext after the encryption. The 
  139.               length of the plaintext must be a multiple of 8. If it is not,
  140.               plaintext bytes will be left at the end of the ciphertext.
  141.  
  142. -------------------------------------------------------------------------------
  143.  
  144. _Decrypt seg,off,len
  145.  
  146.  Function   : Decrypts a ciphertext string using the ECB method
  147.  Argument   : seg: segment of the ciphertext
  148.               off: offset of the ciphertext
  149.               len: length of the ciphertext
  150.  Return     : none
  151.  Affects    : all but DS
  152.  Description: This function decrypts (multiple) blocks of 8 Bytes of cipher-
  153.               text using the ECB method (blocks are not chained). The generated
  154.               plaintext will overwrite the ciphertext. Thus the seg:off
  155.               argument will point to the plaintext after the decryption. The 
  156.               length of the ciphertext must be a multiple of 8. If it is not, 
  157.               ciphertext bytes will be left at the end of the plaintext.
  158.  
  159. -------------------------------------------------------------------------------
  160.  
  161. _CBCEncrypt seg,off,len,segcl,offcl,segch,offch
  162.  
  163.  Function   : Encrypts a plaintext string using the CBC method
  164.  Argument   : seg  : segment of the plaintext
  165.               off  : offset of the plaintext
  166.               len  : length of the plaintext
  167.               segcl: segment of the IV (low DWord)
  168.               offcl: offset of the IV (low DWord)
  169.               segch: segment of the IV (high DWord)
  170.               offch: offset of the IV (high DWord)
  171.  Return     : none
  172.  Affects    : all but DS
  173.  Description: This function encrypts (multiple) blocks of 8 Bytes of plaintext
  174.               using the CBC method (blocks are chained using an initialisation
  175.               vector IV). The generated ciphertext will overwrite the plain-
  176.               text. Thus the seg:off argument will point to the ciphertext 
  177.               after the encryption. The length of the plaintext must be a
  178.               multiple of 8. If it is not, plaintext bytes will be left at the
  179.               end of the ciphertext. The IV must not be secret. For different
  180.               encryptions you can choose the same IV but if possible you should
  181.               use different ones to improve security. 
  182.               Note: you need the original IV for decryption.
  183.  
  184. -------------------------------------------------------------------------------
  185.  
  186. _CBCDecrypt seg,off,len,segcl,offcl,segch,offch
  187.  
  188.  Function   : Decrypts a ciphertext string using the CBC method
  189.  Argument   : seg  : segment of the ciphertext
  190.               off  : offset of the ciphertext
  191.               len  : length of the ciphertext
  192.               segcl: segment of the IV (low DWord)
  193.               offcl: offset of the IV (low DWord)
  194.               segch: segment of the IV (high DWord)
  195.               offch: offset of the IV (high DWord)
  196.  Return     : none
  197.  Affects    : all but DS
  198.  Description: This function decrypts (multiple) blocks of 8 Bytes of ciphertext
  199.               using the CBC method (blocks are chained using an initialisation
  200.               vector IV). The generated plaintext will overwrite the cipher-
  201.               text. Thus the seg:off argument will point to the plaintext 
  202.               after the decryption. The length of the ciphertext must be a
  203.               multiple of 8. If it is not, ciphertext bytes will be left at the
  204.               end of the plaintext.
  205.               Note: The IV is the same used on encryption.
  206.  
  207. -------------------------------------------------------------------------------
  208.  
  209. _ClearBoxes
  210.  
  211.  Function   : Clears the Boxes
  212.  Argument   : none
  213.  Return     : none
  214.  Affects    : EAX, CX, DI
  215.  Description: Clears the contents of the P- and S-Boxes. This should be used
  216.               before you exit your program to make sure that no one can get
  217.               your Key.
  218.  
  219. -------------------------------------------------------------------------------
  220.  
  221. _SetRounds rnds
  222.  
  223.  Function   : Set number of rounds. Returns number of rounds.
  224.  Argument   : rnds: # of rounds = 16, 32 or 2-32. See variable RNDS
  225.  Return     : AX = number of rounds
  226.  Affects    : AX
  227.  Description: You always have to give a Argument. If BFENG386.ASM was compiled
  228.               with "rnds equ 3" you are able to set the number of rounds 
  229.               between 2 and 32. This function always returns the number of
  230.               rounds actual used. If you supply an invalid argument the
  231.               default is used and returned. For more details see variable
  232.               RNDS.
  233.  
  234. -------------------------------------------------------------------------------
  235.  
  236. _GetBoxes seg,off
  237.  
  238.  Function   : Copies the actual P- and S-Boxes to a user buffer
  239.  Arguments  : seg: segment of the user buffer
  240.               off: offset of the user buffer
  241.  Return     : none
  242.  Affects    : BX, CX, DX, SI, DI, direction flag
  243.  Description: Use this to save the original Boxes. If you want to change the
  244.               Password at runtime you have to restore these Boxes first. 
  245.               You can also save the encrypted Boxes and restore them if needed.
  246.               In this way you are able to swap Passwords at high speed.
  247.               The needed buffer size is 1042 for rnds=1 and 1058 for rnds=2 or 
  248.               rnds=3
  249.  
  250. -------------------------------------------------------------------------------
  251.  
  252. _SetBoxes seg,off
  253.  
  254.  Function   : Copies a user buffer to the P- and S-Boxes
  255.  Arguments  : seg: segment of the user buffer
  256.               off: offset of the user buffer
  257.  Return     : none
  258.  Affects    : BX, CX, DX, SI, DI, direction flag
  259.  Description: Use this to restore the Boxes with previously saved ones.
  260.               See description of "_GetBoxes".
  261.  
  262. -------------------------------------------------------------------------------
  263.  
  264. _GetBoxPointer
  265.  
  266.  Function   : Returns a Pointer to the beginning of PBox in DX:AX
  267.  Arguments  : none
  268.  Return     : DX:AX = pointer to the Boxes
  269.  Affects    : AX, DX
  270.  Description: If the _DATA segments are combined, DX will be the same as DS.
  271.               For a reason I do not know DX:AX is sometimes wrong, so verify
  272.               this! You can use this function to initialise DS
  273.  
  274.  
  275. -eof -
  276.